package com.cmict.data.system.dal.mysql.permission;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cmict.data.framework.mybatis.core.mapper.BaseMapperX;
import com.cmict.data.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cmict.data.system.controller.admin.permission.vo.menu.MenuListReqVO;
import com.cmict.data.system.dal.dataobject.permission.MenuDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Set;

@Mapper
public interface MenuMapper extends BaseMapperX<MenuDO> {

    default MenuDO selectByParentIdAndName(Long parentId, String name) {
        return selectOne(new LambdaQueryWrapper<MenuDO>().eq(MenuDO::getParentId, parentId)
                .eq(MenuDO::getName, name));
    }

    default Long selectCountByParentId(Long parentId) {
        return selectCount(MenuDO::getParentId, parentId);
    }

    default List<MenuDO> selectList(MenuListReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<MenuDO>().likeIfPresent(MenuDO::getName, reqVO.getName())
                        .eqIfPresent(MenuDO::getStatus, reqVO.getStatus())
                //.(MenuDO::getTenantId, reqVO.getTenantId())
                //.inIfPresent(MenuDO::getTenantId, 0,reqVO.getTenantId())
        );
    }

    default List<MenuDO> selectListParentId(Long parentId) {
        return selectList(new LambdaQueryWrapperX<MenuDO>()
                .eq(MenuDO::getParentId, parentId)
                .orderByAsc(MenuDO::getSort));
    }

    @Select("SELECT COUNT(*) FROM system_menu WHERE update_time > #{maxUpdateTime}")
    Long selectCountByUpdateTimeGt(LocalDateTime maxUpdateTime);

    @Select("${sql}")
    List<MenuDO> getMenusByTenantAdmin(String sql);

    default   List<MenuDO> getMenusByTypesAndStatuses(Collection<Integer> menuTypes, Collection<Integer> menusStatuses){
        return selectList(new LambdaQueryWrapperX<MenuDO>().inIfPresent(MenuDO::getType, menuTypes)
                .inIfPresent(MenuDO::getStatus, menusStatuses));
    }

    default   List<MenuDO> getThirdMenusByTypesAndStatuses(Collection<Integer> menuTypes, Collection<Integer> menusStatuses,
                                                           Collection<Integer> thirdMenu){
        return selectList(new LambdaQueryWrapperX<MenuDO>().inIfPresent(MenuDO::getType, menuTypes)
                .inIfPresent(MenuDO::getStatus, menusStatuses)
                .inIfPresent(MenuDO::getThirdMenu,thirdMenu));
    }

    @Select({"SELECT parent_id FROM system_menu WHERE id  in (${menuIds}) "})
    Set<Long> getParentIdsByIds(@Param("menuIds") String menuIds);

    @Select({"SELECT id FROM system_menu WHERE parent_id  in (${menuIds}) and  type = 3 "})
    Set<Long> getSonIdsByIds(@Param("menuIds") String menuIds);

    @Select("SELECT LAST_INSERT_ID();")
    Long getLAST_INSERT_ID();
}
